package com.yalpuz.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.hibernate.search.annotations.*;

import javax.persistence.*;
import javax.validation.groups.Default;
import java.util.Date;

@MappedSuperclass
public class BaseEntity {
	/**
	 * "ID"属性名称
	 */
	public static final String ID_PROPERTY_NAME = "id";

	/**
	 * "创建日期"属性名称
	 */
	public static final String CREATE_DATE_PROPERTY_NAME = "createDate";

	/**
	 * "修改日期"属性名称
	 */
	public static final String MODIFY_DATE_PROPERTY_NAME = "modifyDate";

	/**
	 * "版本"属性名称
	 */
	public static final String VERSION_PROPERTY_NAME = "version";
	/**
	 * ID
	 */
	private int id;
	/**
	 * 创建日期
	 */
	@JsonIgnore
	private Date createDate;
	/**
	 * 修改日期
	 */
	@JsonIgnore
	private Date modifyDate;
	/**
	 * 版本
	 */
	@JsonIgnore
	private int version;

	/**
	 * 获取ID
	 *
	 * @return ID
	 */
	@DocumentId
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int getId() {
		return id;
	}

	/**
	 * 设置ID
	 *
	 * @param id ID
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * 获取创建日期
	 *
	 * @return 创建日期
	 */
	@Field(store = Store.YES, index = org.hibernate.search.annotations.Index.YES, analyze = Analyze.NO)
	@Temporal(TemporalType.TIMESTAMP)
	@DateBridge(resolution = Resolution.SECOND)
	@Column(nullable = false, updatable = false)
	public Date getCreateDate() {
		return createDate;
	}

	/**
	 * 设置创建日期
	 *
	 * @param createDate 创建日期
	 */
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}

	/**
	 * 获取修改日期
	 *
	 * @return 修改日期
	 */
	@Field(store = Store.YES, index = org.hibernate.search.annotations.Index.YES, analyze = Analyze.NO)
	@Temporal(TemporalType.TIMESTAMP)
	@Column(insertable = false)
	public Date getModifyDate() {
		return modifyDate;
	}

	/**
	 * 设置修改日期
	 *
	 * @param modifyDate 修改日期
	 */
	public void setModifyDate(Date modifyDate) {
		this.modifyDate = modifyDate;
	}

	/**
	 * 获取版本
	 *
	 * @return 版本
	 */
	@Version
	@Column(nullable = false)
	public int getVersion() {
		return version;
	}

	/**
	 * 设置版本
	 *
	 * @param version 版本
	 */
	public void setVersion(int version) {
		this.version = version;
	}

	/**
	 * 判断是否为新建对象
	 *
	 * @return 是否为新建对象
	 */
	@Transient
	@JsonIgnore
	public boolean isNew() {
		return getId() == 0;
	}

	/**
	 * 重写toString方法
	 *
	 * @return 字符串
	 */
	@Override
	public String toString() {
		return String.format("Entity of type %s with id: %s", getClass().getName(), getId());
	}

	/**
	 * 重写equals方法
	 *
	 * @param obj 对象
	 * @return 是否相等
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (this == obj) {
			return true;
		}
		if (!BaseEntity.class.isAssignableFrom(obj.getClass())) {
			return false;
		}
		BaseEntity other = (BaseEntity) obj;
		return getId() == 0;
	}

	/**
	 * 重写hashCode方法
	 *
	 * @return HashCode
	 */
	@Override
	public int hashCode() {
		return getId();
	}

	/**
	 * 保存验证组
	 */
	public interface Save extends Default {

	}

	/**
	 * 更新验证组
	 */
	public interface Update extends Default {

	}


}
